package com.fejal.dao;



import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import com.fejal.bean.Aluno;
import com.fejal.bean.Curso;
import com.fejal.bean.GradeDisciplina;
import com.fejal.bean.Historico;
import com.fejal.bean.Turma;



public class AlunoDAOHibernate implements AlunoDAO {

	HibernateDAOFactory hibernateDAOFactory = null;
	HibernateDAO<Aluno> hibernateDAO = null;

	public AlunoDAOHibernate() {
		hibernateDAOFactory = new HibernateDAOFactory();
		hibernateDAO = hibernateDAOFactory.getAlunoDao();
	}

	@Override
	public Aluno inserir(Aluno aluno) throws Exception {

		Aluno a;
		
		try {
			a = (Aluno) hibernateDAO.add(aluno);
		} catch (Exception e) {
			throw new Exception(e.getMessage());
		} 
		return a;
	}


	@Override
	public boolean alterar(Aluno aluno) throws Exception {

		boolean ok = false;
		
		try {
			hibernateDAO.update(aluno);
			ok = true;

		} catch (Exception e) {
			throw new Exception(e.getMessage());
		} 

		return ok;
	}

	@Override
	public boolean excluir(Aluno aluno) throws Exception {

		boolean ok = false;

		try {
			hibernateDAO.remove(aluno);
			ok = true;

		} catch (Exception e) {
			throw new Exception(e.getMessage());
		}
		return ok;
	}

	@SuppressWarnings({"unchecked","rawtypes"})
	@Override
	public List<Aluno> getSelecionar(String nome, String matricula, String CPF){

		String 	sql = "FROM Aluno as aluno "+ 
					  "WHERE aluno.pessoa.nome LIKE '"+nome+"%' " +
					  "  	AND aluno.matricula LIKE '"+matricula+"%' " +
					  "		AND aluno.pessoa.CPF LIKE '"+CPF+"%' " ;

		List lista = hibernateDAO.getSession().createQuery(sql).list();
		return lista;
	}	

	@SuppressWarnings({"unchecked","rawtypes"})
	@Override
	public List<Aluno> getSelecionar(Curso curso){

		String 	sql = "FROM Aluno as aluno "+ 
					  "WHERE aluno.curso.codigoCurso = "+curso.getCodigoCurso()+"" ;

	    List lista = hibernateDAO.getSession().createQuery(sql).list();
		return lista;
	}

	@Override
	public Aluno getAluno(int codigoAluno) {
		
		Aluno aluno = hibernateDAO.get(codigoAluno);
		return aluno;
	}

	@Override
	public List<Aluno> getListTodos() {
		
		List<Aluno> list = hibernateDAO.listAll();
		return list;
	}

	@Override
	public Aluno getAluno(String matricula) {
		String 	sql = "FROM Aluno as aluno "+ 
		  "WHERE aluno.matricula = '"+matricula+"'" ;
		Aluno aluno = (Aluno) hibernateDAO.getSession().createQuery(sql).uniqueResult();
		return aluno;
	}

	@SuppressWarnings("unused")
	@Override
	public void inicialize(Aluno aluno){
		if (aluno != null){
			Aluno a = DAOFactory.getAlunoDAO().getAluno(aluno.getCodigoAluno());
			a.getGradeCurricular();
			a.getGradeCurricular().getPeriodos();
			a.getGradeCurricular().getGradeDisciplinas();
            a.getGradeCurricular().getTurmas();
			a.getTurmaOfertaDisciplinas();
			for (GradeDisciplina gradeDisciplina : a.getGradeCurricular().getGradeDisciplinas()){
				for ( GradeDisciplina preRequisito : gradeDisciplina.getPreRequisitos()){
					
				}
			}
			
			for (Historico historico : a.getHistorico()){
				historico.getFaltas();
				historico.getNotas();
			}
			
			
			aluno.setAlunoDescontos(a.getAlunoDescontos());
			aluno.setGradeCurricular(a.getGradeCurricular());
			aluno.setTurmaOfertaDisciplinas(a.getTurmaOfertaDisciplinas());
			aluno.setHistorico(a.getHistorico());
			
			/*
			 * Ordenar turmas por periodo
			 */
			List<Turma> turmas = (List<Turma>) aluno.getGradeCurricular().getTurmas();
			Collections.sort (turmas, new Comparator<Turma>() {     
	             public int compare(Turma o1, Turma o2) {     
	            	 Turma c1 = (Turma) o1;     
	            	 Turma c2 = (Turma) o2;     
	                 return String.valueOf(c1.getPeriodo()).compareTo(String.valueOf(c2.getPeriodo()));
	               }   
			 });			
						
			aluno.getGradeCurricular().setTurmas(turmas);
		}
	}
	
	
}
